iT邦幫忙

2022 iThome 鐵人賽

DAY 13
0
Software Development

Rails Active Model系列 第 13

D-13 Active Model - 自訂義資料轉換器 - 1

  • 分享至 

  • xImage
  •  

我們稍早前介紹過 attribute 的使用方式,今天我們來介紹要怎麼自定義輸入欄位 attribute 的資料型別轉換器吧!

建立自訂轉換器的規則就是,你需要建立一個繼承自ActiveModel::Type::Value的 class,並根據您的自訂規則,覆寫掉 cast_value這個方法。
因為轉換器的觸發流程是,他其實會透過 cast 去把 value 再傳到 cast_value 裡面去進行這裡面的動作。那讀者或許會問,為什麼不 overwrite cast 就好呢?
這是因為,cast 會先排除掉值為 nil 的狀況,也就是 nil 的話就不會進 cast_value 而直接回傳 nil,這對我們撰寫型態轉換 script 來說,就可以少掉一份需要 handle nil 值的工。

接著我們來看範例:

class CustomType < ActiveModel::Type::Value
  def cast_value(value)
    # 比方說,從前端傳來一包 JSON 的 string,我們要把它 parse 為 Hash
    JSON.parse(value)
  end
end

# 接著,在您的 class 裡面,就可以這樣做:
class MyClass
  include ActiveModel::Model
  include ActiveModel::Attributes

  attribute :json, CustomType.new
  # 把剛建立的轉換器 new 一個固定的 instance (會存在 class 的身上,至於存在哪裡,這之後會講),並指定給 `json` 這個 attribute
end

# 來試驗看看吧!首先建立一個假資料,假設是從前端傳來的 json string
input_json = '{"name":"Frank","age":18}'
form_object = MyClass.new json: input_json
puts form_object.json

印出結果如下:

{"name"=>"Frank", "age"=>18}
轉換成功!

但或許讀者您會覺得,每次都要用自定義的轉換器 class 再 new 一個物件,傳進 attribute,這樣有點不太優雅...。
下一篇我們來解決這個問題~!


上一篇
D-12 Active Model 自定義可共用的 validator - 3
下一篇
D-14 Active Model - 自訂義資料轉換器 - 2
系列文
Rails Active Model28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言